package io.bio;


import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 传统的BIO 模型
 * BIO:同步阻塞IO
 * 阻塞：accept,read,write方法都会阻塞线程的执行
 * 如何处理多个连接？
 *  为每一个连接进来的client 启动一个线程，进行读写操作
 * 弊端：如果连接的client 比较多，那么久会启动很多的线程，而在java 中 线程是比较重的，线程的创建以及销毁都会造成资源的浪费，
 *      并且每一个线程都有他自己的独占内存空间，这就导致了不能无限制的生成新的线程。这个时候有想到了一个解决办法，是不是可以
 *      使用线程池，可以是可以，但是线程池也不能解决一次并发量特别大的情况
 * 好处：编程模型相对比较简单
 */
public class BioServer {
    public static void main(String[] args) {
        ServerSocket ss = null;
        try {
            // 创建一个服务端
            ss = new ServerSocket();
            // 设置地址和端口
            ss.bind(new InetSocketAddress("127.0.0.1",9090));
            System.out.println("bio sever is runing,wait accept.....");
            while (true){
                // 等待客户端连接， accept()方法是阻塞方法
                Socket socket = ss.accept();
                // 启动一个线程处理客户端与服务端的读写操作
                new Thread(()->{
                    handle(socket);
                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 处理与客户端的读写操作
     * @param socket
     */
    private static void handle(Socket socket){
        byte[] bytes = new byte[1024];
        try {
            int len = socket.getInputStream().read(bytes);
            System.out.println(new String(bytes,0,len));
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(bytes,0,len);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
